home *** CD-ROM | disk | FTP | other *** search
- {The problem: repeat
- ...
- until SomeEvent;
- If SomeEvent (external hardware signals etc.) never comes, the program
- hangs. So I did this code to avoid hangup's. Look below for example.
-
- GetTimeWord returns the actual timer value.
- SetTimeOutTicks sets a timeout-value to a word variable TimeVar.
- IsTimeOut returns true when TimeVar >= actual time or false if lower.
-
- All 3 functions/procedures are very fast. The function IsTimeOut runs
- about 2.000.000!/second on a P90-machine.
-
- Dec. 12, 1995, Udo Juerss, 57078 Siegen, Germany, CompuServe [101364,526]}
-
- uses
- Crt;
- {---------------------------------------------------------------------------}
-
- var
- Time : Word;
- Count : LongInt;
- {---------------------------------------------------------------------------}
-
- function GetTimeWord:Word; assembler;
- asm
- mov es,Seg0040
- mov di,6Ch
- mov ax,word ptr es:[di]
- end;
- {---------------------------------------------------------------------------}
-
- procedure SetTimeOutTicks(Ticks:Word; var TimeVar:Word); assembler;
- asm
- call GetTimeWord
- add ax,Ticks
- les di,TimeVar
- stosw
- end;
- {---------------------------------------------------------------------------}
-
-
- function IsTimeOut(TimeVar:Word):Boolean; assembler;
- asm
- mov bx,TimeVar
- call GetTimeWord
- cmp ax,bx
- mov al,0
- jl @End
- mov al,1
- @End:
- end;
- {---------------------------------------------------------------------------}
-
- begin
- ClrScr;
- Count:=0;
- SetTimeOutTicks(18,Time); {1 second equals ~18.2 timer ticks}
- Writeln('Waiting for 1 second and counting IsTimeOut query...');
- repeat
- Inc(Count);
- until IsTimeOut(Time);
- Writeln('IsTimeOut query = ',Count:8,' times/sec.');
- ReadKey;
- end.